package gases.as3.librarys.core.net.socket
{
	import flash.utils.ByteArray;
	import flash.utils.IDataInput;
	import flash.utils.IDataOutput;

	public class SocketUtil
	{
		static private var buffer : ByteArray = new ByteArray();

		/**
		 * 对INT进行高低位转换
		 * 代替 IDataInput 接口的 readInt方法
		 * IDataInput接口用于提供一组读取2进制数据的方法
		 * @param source 读取的位置
		 * @return 
		 * 
		 */
		static public  function readInt(source : IDataInput) : int
		{
			var v1 : int = source.readByte();
			var v2 : int = source.readByte();
			var v3 : int = source.readByte();
			var v4 : int = source.readByte();
			buffer.position = 0;
			buffer.writeByte(v4);
			buffer.writeByte(v3);
			buffer.writeByte(v2);
			buffer.writeByte(v1);
			buffer.position = 0;
			return buffer.readInt();
		}

		/**
		 * 对INT进行高低位转换
		 * 代替IDataOutput的writeInt方法
		 * @param value
		 * @param destination
		 * 
		 */
		static public  function writeInt(value : int,destination : IDataOutput) : void
		{
			buffer.position = 0;
			buffer.writeInt(value);
			destination.writeByte(buffer[3]);
			destination.writeByte(buffer[2]);
			destination.writeByte(buffer[1]);
			destination.writeByte(buffer[0]);
		}

		/**
		 * 对INT64进行高低位转换
		 * @param source
		 * @return 
		 * 
		 */
		static public  function readInt64(source : IDataInput) : Number
		{
			var v1 : int = source.readByte();
			var v2 : int = source.readByte();
			var v3 : int = source.readByte();
			var v4 : int = source.readByte();
			var v5 : int = source.readByte();
			var v6 : int = source.readByte();
			var v7 : int = source.readByte();
			var v8 : int = source.readByte();
			
			buffer.position = 0;
			buffer.writeByte(v8);
			buffer.writeByte(v7);
			buffer.writeByte(v6);
			buffer.writeByte(v5);
			buffer.writeByte(v4);
			buffer.writeByte(v3);
			buffer.writeByte(v2);
			buffer.writeByte(v1);
			buffer.position = 0;
			
			v1=v1&0x000000ff;
			v2=v2&0x000000ff;
			v3=v3&0x000000ff;
			v4=v4&0x000000ff;
			v5=v5&0x000000ff;
			v6=v6&0x000000ff;
			v7=v7&0x000000ff;
			
			var v1r2: Number = v1;
			var v2r2: Number = v2;
			var v3r2: Number = v3;
			var v4r2: Number = v4;
			var v5r2: Number = v5;
			var v6r2: Number = v6;
			var v7r2: Number = v7;
			
			var reInt64:Number=0;
			reInt64=v6r2*1099511627776+v5r2*4294967296+v4r2*16777216+v3r2*65536+v2r2*256+v1r2;
			return reInt64;
		}
		
		/**
		 * 对INT64进行高地位转换 
		 * @param value
		 * @param destination
		 * 
		 */
		static public  function writeInt64(value : int,destination : IDataOutput) : void
		{
			//待验证
			
			buffer.position = 0;
			buffer.writeByte(buffer[7]);
			buffer.writeByte(buffer[6]);
			buffer.writeByte(buffer[5]);
			buffer.writeByte(buffer[4]);
			buffer.writeByte(buffer[3]);
			buffer.writeByte(buffer[2]);
			buffer.writeByte(buffer[1]);
			buffer.writeByte(buffer[0]);
			
			destination.writeByte(buffer[7]);
			destination.writeByte(buffer[6]);
			destination.writeByte(buffer[5]);
			destination.writeByte(buffer[4]);
			destination.writeByte(buffer[3]);
			destination.writeByte(buffer[2]);
			destination.writeByte(buffer[1]);
			destination.writeByte(buffer[0]);
		}
		
		/**
		 * 对Short进行高低位转换
		 */
		static public  function readShort(source : IDataInput) : int
		{
			buffer.position = 0;
			var v1 : int = source.readByte();
			var v2 : int = source.readByte();
			buffer.writeByte(v2);
			buffer.writeByte(v1);
			buffer.position = 0;
			return buffer.readShort();
		}

		/**
		 * 对Short进行高低位转换
		 */
		static public  function writeShort(value : int , destination : IDataOutput) : void
		{
			buffer.position = 0;
			buffer.writeShort(value);
			buffer.position = 0 ;
			destination.writeByte(buffer[1]);
			destination.writeByte(buffer[0]);
		}

		/**
		 * ByteArray解码
//		 */
//		static public function decode(ba : ByteArray, dest : ISocketStruct) : void
//		{
//			ba.position = 0;
//			var nsize : int = ba.length;
//			var data : Object = dest.data;
//			var props : Array = dest.propersarr;
//			var bufsizes : Array = dest.bufsizearr;
//			var typeofsarr : Array = dest.typeofsarr;
//			for(var i : int = 0;i < props.length; i++)
//			{
//				switch(String(typeofsarr[i]))
//				{
//					case "char":
//						if(int(bufsizes[i]) > 0)
//						{
//							data[props[i]] = ba.readMultiByte(bufsizes[i], "GB2312");
//							nsize -= bufsizes[i];
//						}
//						else
//						{
//							data[props[i]] = ba.readMultiByte(nsize, "GB2312");
//						}
//						break;
//					case "int":
//						data[props[i]] = readInt(ba);
//						nsize -= 4;
//						break;
//					case "short":
//						data[props[i]] = readShort(ba);
//						nsize -= 2;
//						break;
//					case "byte":
//						data[props[i]] = ba.readByte();
//						nsize -= 1;
//						break;
//					case "bool":
//						data[props[i]] = ba.readBoolean();
//						nsize -= 1;
//						break;
//				}
//			}
//		}
//
//		/**
//		 * ByteArray重编码
//		 */
//		static public function encode(source : ISocketStruct) : ByteArray
//		{
//			var ba : ByteArray = new ByteArray();
//			var nsize : int = ba.position;
//			var data : Object = source.data;
//			var props : Array = source.propersarr;
//			var bufsizes : Array = source.bufsizearr;
//			var typeofsarr : Array = source.typeofsarr;
//			for(var i : int = 0;i < props.length; i++)
//			{
//				ba.position = nsize;
//				switch(String(typeofsarr[i]))
//				{
//					case "char":
//						ba.writeMultiByte(String(data[props[i]]), "GB2312");
//						if(int(bufsizes[i]) > 0)
//						{
//							nsize += bufsizes[i];
//						}
//						break;
//					case "int":
//						writeInt(int(data[props[i]]), ba);
//						nsize += 4;
//						break;
//					case "short":
//						writeShort(int(data[props[i]]), ba);
//						nsize += 2;
//						break;
//					case "byte":
//						ba.writeByte(int(data[props[i]]));
//						nsize += 1;
//						break;
//					case "bool":
//						ba.writeBoolean(Boolean(data[props[i]]));
//						nsize += 1;
//						break;
//				}
//			}
//			return ba;
//		}
	}
}